﻿using System;
using System.Collections.Generic;

using System.Reflection;
using ClickLand.CorporacionPlaza.Comunes.Entidades;
using ClickLand.CorporacionPlaza.Comunes.Recursos;
using ClickLand.CorporacionPlaza.LogicaNegocio.Contratos;
using ClickLand.CorporacionPlaza.LogicaNegocio.Implementacion.ComandosEstablecimiento;
using Logger;


namespace ClickLand.CorporacionPlaza.LogicaNegocio.Fabricas
{
    public class FabricaComandosEstablecimiento
    {
        /// <summary> Metodo que obtiene una instancia de un comando que agrega o inserta un establecimiento </summary>
        /// <param name="establecimiento">datos del establecimiento a insertar o modificar</param>
        /// <return>Comando que agrega o inserta</return>
        public static IComando<bool> ObtenerComandoAgregarEditar(Establecimiento establecimiento)
        {
            #region Instrumentacion Entrada
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.EntrandoMetodo,MethodBase.GetCurrentMethod().Name));
            #endregion
            var retorno = new AgregarEditar(establecimiento);
            #region Instrumentacion Salida
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.SaliendoMetodo,MethodBase.GetCurrentMethod().Name));
            #endregion
            return retorno;
        }


        /// <summary> Metodo que obtiene una instancia de un comando que consulta todos los establecimientos </summary>
        /// <param name="establecimiento">Parametros para la busqueda </param>
        /// <return>Lista de establecimientos</return>
        public static IComando<List<Establecimiento>> ObtenerComandoConsultarTodos(Establecimiento establecimiento)
        {
            #region Instrumentacion Entrada
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.EntrandoMetodo,MethodBase.GetCurrentMethod().Name));
            #endregion
            var retorno = new Consultar(establecimiento);
            #region Instrumentacion Salida
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.SaliendoMetodo,MethodBase.GetCurrentMethod().Name));
            #endregion
            return retorno;
        }

        /// <summary> Metodo que obtiene una instancia de un comando que consulta los establecimientos por su id </summary>
        /// <param name="id">identificador del establecimiento</param>
        /// <returns>Comando que retorna un establecimiento</returns>
        public static IComando<Establecimiento> ObtenerComandoConsultarId(long id)
        {
            #region Instrumentacion Entrada
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.EntrandoMetodo,MethodBase.GetCurrentMethod().Name));
            #endregion
            var retorno = new ConsultarId(id);
            #region Instrumentacion Salida
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.SaliendoMetodo,MethodBase.GetCurrentMethod().Name));
            #endregion
            return retorno;
        }


        /// <summary> Comando que consulta los establecimientos libres segun un rango de fecha </summary>
        /// <param name="inicio"> </param>
        /// <param name="fechaInicio">fecha de inicio del rango</param>
        /// <returns></returns>
        public static IComando<IList<Establecimiento>> ObtenerComandoConsultarEstablecimientosLibres(DateTime inicio, DateTime fin)
        {
            #region Instrumentacion Entrada
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.EntrandoMetodo,MethodBase.GetCurrentMethod().Name));
            #endregion
            var retorno = new ConsultarEstablecimientosLibres(inicio,fin);
            #region Instrumentacion Salida
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.SaliendoMetodo,MethodBase.GetCurrentMethod().Name));
            #endregion
            return retorno;
        }
    }
}
